package com.javastudy.jdkfeature.jdk5.variableargument;

/**
 * http://blog.csdn.net/u012179540/article/details/40313625
 * 1. 可变长参数的定义
 * 使用...表示可变长参数，例如
 * print(String... args){
 * ...
 * }
 * 在具有可变长参数的方法中可以把参数当成数组使用，例如可以循环输出所有的参数值。
 * <p>
 * 2. 可变长参数的方法的调用
 * 调用的时候可以给出任意多个参数也可不给参数，例如：
 * print();
 * print("hello");
 * print("hello","lisi");
 * <p>
 * <p>
 * 3. 可变长参数的使用规则
 * 3.1 在调用方法的时候，如果能够和固定参数的方法匹配，也能够与可变长参数的方法匹配，则选择固定参数的方法。
 * public void print(String... args){}
 * public void print(String test){}
 * 3.2 如果要调用的方法可以和两个可变参数匹配，则出现错误
 * public void print(String... args){}
 * public void print(String test,String...args ){}
 * 则下面编译不过
 * test.print("hello");
 * test.print("hello", "alexia");
 * <p>
 * 3.3 一个方法只能有一个可变长参数，并且这个可变长参数必须是该方法的最后一个参数
 * <p>
 * 4. 可变长参数的使用规范
 * 4.1 避免带有可变长参数的方法重载：如3.1中，编译器虽然知道怎么调用，但人容易陷入调用的陷阱及误区
 * 4.2 别让null值和空值威胁到变长方法
 * public void print(String test,Integer...args ){}
 * public void print(String test,String...args ){}
 * 则下面编译不过
 * test.print("hello");
 * test.print("hello", null);
 * <p>
 * 4.3 覆写变长方法也要循规蹈矩
 * 覆写必须满足的条件：
 * （1）重写方法不能缩小访问权限；
 * （2）参数列表必须与被重写方法相同（包括显示形式）；
 * （3）返回类型必须与被重写方法的相同或是其子类；
 * （4）重写方法不能抛出新的异常，或者超过了父类范围的异常，但是可以抛出更少、更有限的异常，或者不抛出异常。
 */
public class VariableArgumentsTest {
    /**
     * 例如在jdk14中，如果需要传一堆字符串
     * 这么写
     */
    public static void jdk14(String[] strs) {
        for (int i = 0, max = strs == null ? 0 : strs.length
             ; i < max; i++) {
            System.out.print(strs[i]);
        }
    }

    /**
     * 在jdk1.5中，我们可以这么写,注意String后面的3个点...
     *
     * @param strs
     */
    public static void jdk15(String... strs) {
        for (int i = 0, max = strs == null ? 0 : strs.length
             ; i < max; i++) {
            System.out.print(strs[i]);
        }
    }

    public static void main(String[] args) {
        String[] strs = {"a", "b", "c"};
        VariableArgumentsTest.jdk14(strs);//abc
        VariableArgumentsTest.jdk15(strs);//abc
        //jdk15还可以
        VariableArgumentsTest.jdk15("a", "b", "c");//abc
    }

}
